home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / gnu / dejagnu.lha / dejagnu-1.0.1 / expect / exp_simple.c < prev    next >
C/C++ Source or Header  |  1993-03-15  |  3KB  |  99 lines

  1. /* interact (with only one process) - give user keyboard control
  2.  
  3. Written by: Don Libes, NIST, 2/6/90
  4.  
  5. Design and implementation of this program was paid for by U.S. tax
  6. dollars.  Therefore it is public domain.  However, the author and NIST
  7. would appreciate credit if this program or parts of it are used.
  8. */
  9.  
  10. /* This file exists for deficient versions of UNIX that lack select,
  11. poll, or some other multiplexing hook.  Instead, this code uses two
  12. processes per spawned process.  One sends characters from the spawnee
  13. to the spawner; a second send chars the other way.
  14.  
  15. This will work on any UNIX system.  The only sacrifice is that it
  16. doesn't support multiple processes.  Eventually, it should catch
  17. SIGCHLD on dead processes and do the right thing.  But it is pretty
  18. gruesome to imagine so many processes to do all this.  If you change
  19. it successfully, please mail back the changes to me.  - Don
  20. */
  21.  
  22. #include "exp_conf.h"
  23. #include <stdio.h>
  24. #include <errno.h>
  25. #include <sys/types.h>
  26. #include <sys/time.h>
  27. #include "tcl.h"
  28. #include "exp_global.h"
  29. #include "exp_command.h"    /* for struct f defs */
  30. #include "exp_event.h"
  31.  
  32. /*ARGSUSED*/
  33. void
  34. exp_event_disarm(fd)
  35. int fd;
  36. {
  37. }
  38.  
  39. /* returns status, one of EOF, TIMEOUT, ERROR or DATA */
  40. /*ARGSUSED*/
  41. int
  42. exp_get_next_event(interp,masters, n,master_out,timeout,key)
  43. Tcl_Interp *interp;
  44. int *masters;
  45. int n;            /* # of masters */
  46. int *master_out;    /* 1st event master, not set if none */
  47. int timeout;        /* seconds */
  48. int key;
  49. {
  50.     int m;
  51.     struct f *f;
  52.  
  53.     if (n > 1) {
  54.         exp_error(interp,"expect not compiled with multiprocess support");
  55.         /* select a different INTERACT_TYPE in Makefile */
  56.         return(TCL_ERROR);
  57.     }
  58.  
  59.     m = *master_out = masters[0];
  60.     f = fs + m;
  61.  
  62.     if (f->key != key) {
  63.         f->key = key;
  64.         f->force_read = FALSE;
  65.         return(EXP_DATA_OLD);
  66.     } else if ((!f->force_read) && (f->size != 0)) {
  67.         return(EXP_DATA_OLD);
  68.     }
  69.  
  70.     return(EXP_DATA_NEW);
  71. }
  72.  
  73.  
  74. /* There is no portable way to do sub-second sleeps on such a system, so */
  75. /* do the next best thing (without a busy loop) and fake it: sleep the right */
  76. /* amount of time over the long run.  Note that while "subtotal" isn't */
  77. /* reinitialized, it really doesn't matter for such a gross hack as random */
  78. /* scheduling pauses will easily introduce occasional one second delays. */
  79. void
  80. exp_usleep(usec)
  81. long usec;        /* microseconds */
  82. {
  83.     static subtotal = 0;
  84.     int seconds;
  85.  
  86.     subtotal += usec;
  87.     if (subtotal < 1000000) return;
  88.     seconds = subtotal/1000000;
  89.     subtotal = subtotal%1000000;
  90.     sleep(seconds);
  91. }
  92.  
  93. /* set things up for later calls to event handler */
  94. void
  95. exp_init_event()
  96. {
  97.     exp_event_exit = 0;
  98. }
  99.